#pragma once
#include "DMatrix4.h"
#include "DVector4.h"

namespace Skill
{
	namespace Ode
	{		
		void DMatrix4::CollectManagedMemory()
		{
		}

		dReal DMatrix4::default::get(int index)
		{
			return _This[index];
		}
		void DMatrix4::default::set(int index , dReal value)
		{
			_This[index] = value;
		}

		dReal DMatrix4::default::get(int i,int j)
		{
			return _This[i*4 + j];
		}
		void DMatrix4::default::set(int i,int j,dReal value)
		{
			_This[i*4 + j] = value;
		}

		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[0],dReal,M11);
		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[1],dReal,M21);
		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[2],dReal,M31);
		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[3],dReal,M41);


		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[4],dReal,M12);
		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[5],dReal,M22);
		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[6],dReal,M32);
		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[7],dReal,M42);

		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[8],dReal,M13);				
		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[9],dReal,M23);				
		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[10],dReal,M33);				
		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[11],dReal,M43);

		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[8],dReal,M14);				
		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[9],dReal,M24);				
		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[10],dReal,M34);				
		VALUE_PROP_DEFINITION_GETSET(DMatrix4,_This[11],dReal,M44);
			
		void DMatrix4::SetZero()
		{
			dSetZero(_This,16);
		}
		void DMatrix4::SetValue(dReal value)
		{
			dSetValue(_This,16,value);
		}

		bool DMatrix4::FactorCholesky()
		{
			return (dFactorCholesky(_This,4) == 1);
		}

		void DMatrix4::SolveCholesky(DMatrix4^ L , DVector4^ %b)
		{			
			dSolveCholesky(L->_This,b->_This,4);			
		}

		bool DMatrix4::InvertPDMatrix(DMatrix4^ A, DMatrix4^ %Ainv)
		{
			return dInvertPDMatrix(A->_This,Ainv->_This,4) == 1;
		}

		bool DMatrix4::IsPositiveDefinite::get()
		{
			return dIsPositiveDefinite(_This,4) == 1;
		}

		void DMatrix4::FactorLDLT(DMatrix4^ A, DMatrix4^ %d,int nskip)
		{
			dFactorLDLT(A->_This,d->_This,4,nskip);
		}

		void DMatrix4::SolveL1(DMatrix4^ L, DVector4^ %b,int nskip)
		{
			dSolveL1(L->_This, b->_This,4,nskip);
		}
		void DMatrix4::SolveL1T(DMatrix4^ L, DVector4^ %b,int nskip)
		{
			dSolveL1T(L->_This, b->_This,4,nskip);
		}
	}
}